package cn.thinkluck.pattern.chain;

/**
 * 处理器执行链
 *
 * @Author liutao
 * @DateTime 2024/8/3 下午2:26
 */
public class HandlerChain {
    // 链头
    private Handler headPoint = null;
    // 链尾
    private Handler tailPoint = null;

    /**
     * 添加处理器
     *
     * @param handler 添加进来的处理器
     */
    private void addHandler(Handler handler) {
        //如果执行链 链头是空的
        if (this.headPoint == null) {
            //链头指向新添加的handler
            this.headPoint = handler;
        } else {
            //否则，将新加入的handler跟在当前链尾后面
            this.tailPoint.setNextHandler(handler);
        }
        //将新加入的handler作为链尾
        this.tailPoint = handler;
    }

    /**
     * 执行链条
     *
     * @param request 某些请求(需要被执行的任意参数)
     */
    private void run(Object request) {
        this.headPoint.handleRequest(request);
    }

    //测试
    public static void main(String[] args) {
        //新建链
        HandlerChain chain = new HandlerChain();
        //往链上加处理器
        chain.addHandler(new AHandlerImpl());
        chain.addHandler(new BHandlerImpl());
        chain.addHandler(new CHandlerImpl());
        //执行链条处理请求参数
        chain.run("模拟请求参数");
    }
}
